"""
通用工具模块
"""
import os
import sys
import pandas as pd
from loguru import logger

def setup_logger(log_file="backtest.log", log_level="INFO"):
    """
    设置日志配置
    
    Parameters
    ----------
    log_file : str
        日志文件路径
    log_level : str
        日志级别，可选值：TRACE, DEBUG, INFO, SUCCESS, WARNING, ERROR, CRITICAL
    """
    # 移除默认的处理器
    logger.remove()
    
    # 添加控制台输出处理器
    logger.add(
        sys.stderr,
        format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level: <8}</level> | <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>",
        level=log_level,
        colorize=True
    )
    
    # 添加文件输出处理器
    if log_file:
        # 确保日志文件所在目录存在
        log_dir = os.path.dirname(log_file)
        if log_dir and not os.path.exists(log_dir):
            os.makedirs(log_dir)
            
        logger.add(
            log_file,
            format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function}:{line} - {message}",
            level=log_level,
            rotation="100 MB",    # 当日志文件达到100MB时轮转
            retention="30 days",  # 保留30天的日志
            compression="zip",    # 压缩轮转的日志文件
            encoding="utf-8",     # 使用utf-8编码
            enqueue=True         # 异步写入
        )
    
    logger.info("日志系统初始化完成")

def load_ticker_info(file_path):
    """
    加载通用的交易品种信息
    
    Parameters
    ----------
    file_path : str
        CSV文件路径
        
    Returns
    -------
    pandas.DataFrame
        包含交易品种信息的DataFrame
    """
    if not os.path.exists(file_path):
        logger.warning(f"找不到交易品种信息文件: {file_path}")
        return pd.DataFrame(columns=['instrument', 'slippage', 'multiplier', 'margin_rate'])
    
    df = pd.read_csv(file_path)
    required_columns = ['instrument', 'slippage', 'multiplier', 'margin_rate']
    missing_columns = [col for col in required_columns if col not in df.columns]
    
    if missing_columns:
        logger.error(f"交易品种信息文件缺少必需的列: {missing_columns}")
        return pd.DataFrame(columns=required_columns)
    
    return df.set_index('instrument')
